#include<bits/stdc++.h>

using namespace std;
using i64 = long long;
using pii = pair<int, int>;

int read() {
	int x = 0, f = 0; char ch = getchar();
	while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
	while (isdigit(ch)) x = x * 10 + (ch - '0'), ch = getchar();
	return x;
}
int __stk[128], __len;
void put(i64 x) {
	if (x < 0) putchar('-'), x = -x;
	do { __stk[++__len] = x % 10; }while (x /= 10);
	while (__len) putchar(__stk[__len--] + '0');
}

const int N = 2e5 + 10, K = 410, mod = 998244353;
int n, k;
int head[N], nxt[N << 1], to[N << 1], cnt;
bool flag = 1;

void link(int u, int v) {
	if (abs(u - v) != 1) flag = 0;
	to[++cnt] = v, nxt[cnt] = head[u], head[u] = cnt;
	to[++cnt] = u, nxt[cnt] = head[v], head[v] = cnt;
} 
void add(int &x, int y) { (x += y) >= mod && (x -= mod); }

int dp[N][K], sum[K];
void solve1() {
	// dp_{i,j} = \sum_{j-1} [0, i);
	memset(sum, 0, sizeof sum), sum[0] = 1;
	for (int i = 1; i < n; ++i) for (int j = k; j; --j) add(sum[j], sum[j - 1]);
	for (int i = 1; i <= k; ++i) put(sum[i - 1]), putchar('\n');
}
struct BCJ{
	int fa[N], siz;
	int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
	void merge(int x, int y) {
		x = find(x), y = find(y);
		if (x == y) return;
		fa[x] = y, --siz;
	}
	void insert(int x) { fa[x] = x, ++siz;}
}F;

int main() {
	freopen("soft.in", "r", stdin);
	freopen("soft.out", "w", stdout);
	n = read(), k = read();
	for (int i = 1; i < n; ++i) link(read(), read());
	if (flag) solve1(), exit(0);
	dp[0][0] = 1;
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= k; ++j) sum[j] = 0; 
		F.siz = 0;
		for (int j = i; j; --j) {
			F.insert(j);
			for (int e = head[j]; e; e = nxt[e]) 
				if (to[e] > j && to[e] <= i) F.merge(j, to[e]);
			if (F.siz == 1) for (int l = 0; l < k; ++l) 
				add(sum[l], dp[j - 1][l]);
		}
		for (int l = 1; l <= k; ++l) add(dp[i][l], sum[l - 1]);
	}
	for (int i = 1; i <= k; ++i) put(dp[n][i]), putchar('\n');
	return 0;
}
/*
2 2
2 1


5 5
1 2
1 3
3 4
3 5
*/
